001    /* EVolve - an Extensible Software Visualization Framework
002     * Copyright (C) 2001-2002 Qin Wang
003     *
004     * This library is free software; you can redistribute it and/or
005     * modify it under the terms of the GNU Library General Public
006     * License as published by the Free Software Foundation; either
007     * version 2 of the License, or (at your option) any later version.
008     *
009     * This library is distributed in the hope that it will be useful,
010     * but WITHOUT ANY WARRANTY; without even the implied warranty of
011     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
012     * Library General Public License for more details.
013     *
014     * You should have received a copy of the GNU Library General Public
015     * License along with this library; if not, write to the
016     * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
017     * Boston, MA 02111-1307, USA.
018     */
019    
020    /*
021     * EVolve is distributed at http://www.sable.mcgill.ca/EVolve/
022     */
023    
024    package EVolve.visualization;
025    
026    import EVolve.*;
027    import EVolve.exceptions.NoDataPlotException;
028    import EVolve.data.*;
029    import EVolve.util.*;
030    import java.util.*;
031    
032    public class ReferenceDimension extends Dimension implements Cloneable{
033        private ArrayList comparatorList;
034        private int currentOrder;
035        private int[] order;
036        private int [] orderBfUnify;
037        private Entity[] entity;
038        private HashSet linkedEntity;
039        private int selectedIndex;
040        private int entityNumber;
041        private HashMap Int2Entity, EntityName2Int;
042        private Sorter sorter;
043    
044        public ReferenceDimension() {
045            comparatorList = new ArrayList();
046            linkedEntity = null;
047            selectedIndex = 0;
048            entityNumber = -1;
049            Int2Entity = new HashMap();
050            EntityName2Int = new HashMap();
051            orderBfUnify = null;
052        }
053    
054        public int getMaxEntityNumber() {
055            return Scene.getDataManager().getEntity()[dataFilter.getTargetType()].size();
056        }
057    
058        public int getEntityNumber() {
059            return entity==null ? -1 : entity.length;
060        }
061    
062        public long getField(Element element) {
063            long returnVal = dataFilter.getData(element);
064            Integer mappedId = findMappedId(returnVal);
065    
066            if (order[mappedId.intValue()] == Integer.MAX_VALUE) {
067                order[mappedId.intValue()] = currentOrder;
068                currentOrder++;
069            }
070            return mappedId.intValue();
071        }
072    
073        public void preVisualize() {
074            currentOrder = 0;
075            EntityName2Int.clear();
076            Int2Entity.clear();
077            order = new int[getMaxEntityNumber()];
078            for (int i = 0; i < order.length; i++) {
079                order[i] = Integer.MAX_VALUE;
080            }
081        }
082    
083        public void restore() {
084            order = new int[getMaxEntityNumber()];
085            for (int i = 0; i < order.length; i++) {
086                if (i<currentOrder)
087                    order[i] = i;
088                else
089                    order[i] = Integer.MAX_VALUE;
090            }
091            linkedEntity = null;
092    
093            ArrayList tobeDel = new ArrayList();
094            Iterator it = Int2Entity.keySet().iterator();
095            while (it.hasNext()) {
096                Integer key = (Integer)it.next();
097                if (key.intValue() >= currentOrder) {
098                    tobeDel.add(key);
099                }
100            }
101            for (int i=0; i<tobeDel.size(); i++) {
102                Int2Entity.remove(tobeDel.get(i));
103            }
104    
105            tobeDel.clear();
106            it = EntityName2Int.keySet().iterator();
107            while (it.hasNext()) {
108                Object key = it.next();
109                Integer value = (Integer)EntityName2Int.get(key);
110                if (value.intValue() >= currentOrder) {
111                    tobeDel.add(key);
112                }
113            }
114            for (int i=0; i<tobeDel.size(); i++) {
115                EntityName2Int.remove(tobeDel.get(i));
116            }
117        }
118    
119        public void visualize() throws NoDataPlotException{
120    
121            if (linkedEntity == null) {
122                entity = new Entity[currentOrder];
123    
124                for (int i = 0; i < order.length; i++) {
125                    if (order[i] != Integer.MAX_VALUE) {
126                        entity[order[i]] = (Entity)Int2Entity.get(new Integer(i));
127                    }
128                }
129            } else { // unified reference dimension
130                int free = currentOrder;
131                entityNumber = currentOrder;
132                entity = new Entity[linkedEntity.size()];
133    
134                order = new int[linkedEntity.size()];
135                Iterator it = linkedEntity.iterator();
136                while (it.hasNext()) {
137                    Entity aEntity = (Entity)it.next();
138                    Integer mappedId = (Integer)EntityName2Int.get(aEntity.getName());
139                    if (mappedId != null) {
140                        order[mappedId.intValue()] = mappedId.intValue();
141                        entity[order[mappedId.intValue()]] = aEntity;
142                    } else {
143                        Int2Entity.put(new Integer(free), aEntity);
144                        EntityName2Int.put(aEntity.getName(), new Integer(free));
145                        order[free] = Integer.MAX_VALUE;
146                        entity[free] = aEntity;
147                        free++;
148                    }
149                }
150            }
151    
152            comparatorList.clear();
153            comparatorList.add(new LexicalComparator());
154            comparatorList.add(new ValueComparator("Temporal", true, order, EntityName2Int));
155            ArrayList entityComparatorList = ((EntityDefinition)(Scene.getDataManager().getElementDefinition()[dataFilter.getTargetType()])).getComparator();
156            for (int i = 0; i < entityComparatorList.size(); i++) {
157                comparatorList.add(entityComparatorList.get(i));
158            }
159    
160            sorter = new Sorter(entity, (EntityComparator)(comparatorList.get(selectedIndex)));
161    
162            // we generate an exception on purpose for empty image
163            if (entity.length == 0) throw new NoDataPlotException();
164        }
165    
166        public Entity getEntity(int index) {
167            int newMappedId = (sorter == null) ? index : sorter.getSource(index);
168    
169            if (Int2Entity.containsKey(new Integer(newMappedId))) {
170                return (Entity)Int2Entity.get(new Integer(newMappedId));
171            }
172    
173            return null;
174        }
175    
176        public ArrayList getComparator() {
177            return comparatorList;
178        }
179    
180        public void selectComparator(int selectedIndex) {
181            sorter = new Sorter(entity, (EntityComparator)(comparatorList.get(selectedIndex)));
182            this.selectedIndex = selectedIndex;
183        }
184    
185        public void addComparator(EntityComparator comparator) {
186            boolean found = false;
187            for (int i=0; i<comparatorList.size(); i++) {
188                if (((EntityComparator)comparatorList.get(i)).getName().equals(comparator.getName()))
189                    found = true;
190            }
191            if (!found) comparatorList.add(comparator);
192        }
193    
194        public int getSortedIndex(int mappedId) {
195            if (order[mappedId] == Integer.MAX_VALUE) {
196                return -1;
197            } else {
198                return sorter.getTarget(order[mappedId]);
199            }
200        }
201    
202        public int getOriginMappedId(int sortedId) {
203            int mappedId = sorter.getSource(sortedId);
204            return mappedId;
205        }
206    
207        public void makeSelection(int sourceType, int[] selection) {
208            if (selection.length != 0) {
209                long[] selected = new long[selection.length];
210                for (int i = 0; i < selected.length; i++) {
211                    selected[i] = getEntity(selection[i]).getId();
212                }
213                Scene.getFilter().addSelection(new Selection(sourceType,dataFilter.getTargetType(), selected, 0, Long.MAX_VALUE,null));
214            }
215        }
216    
217        public void makeSelection(int sourceType, int[] selection, long start, long end, ArrayList timeMap) {
218            if (selection.length != 0) {
219                long[] selected = new long[selection.length];
220                for (int i = 0; i < selected.length; i++) {
221                    selected[i] = getEntity(selection[i]).getId();
222                }
223                Scene.getFilter().addSelection(new Selection(sourceType, dataFilter.getTargetType(), selected, start, end, timeMap));
224            }
225        }
226    
227        public Entity[] getEntities() {
228            return entity;
229        }
230    
231        public void linkEntities(HashSet linkedEntity) {
232            if (this.linkedEntity != null)
233                restore();
234            this.linkedEntity = linkedEntity;
235        }
236    
237        public void clearEntityMap() {
238            linkedEntity = null;
239            entity = null;
240            entityNumber = -1;
241        }
242    
243        public int getSelectedComparatorIndex() {
244            return selectedIndex;
245        }
246    
247        public String getSelectedComparatorName() {
248    
249            return ((EntityComparator)comparatorList.get(selectedIndex)).getName();
250        }
251    
252        public int[] getOrdering() {
253            if (orderBfUnify == null)
254                return order;
255            else
256                return orderBfUnify;
257        }
258    
259        public void updateOrdering(int[] newOrder) {
260            if (orderBfUnify == null)
261                orderBfUnify = order;
262            order = newOrder;
263        }
264    
265        public int getEntityNumberBeforeLink() {
266            return entityNumber;
267        }
268    
269        public HashMap getEntityName2IntMap() {
270            return EntityName2Int;
271        }
272    
273        public HashMap getInt2EntityMap() {
274            return Int2Entity;
275        }
276    
277        public Entity getEntityFromInt(int mappedId) {
278            Integer key = new Integer(mappedId);
279            if (Int2Entity.containsKey(key)) {
280                return (Entity)Int2Entity.get(key);
281            } else
282                return null;
283        }
284    
285        private Integer findMappedId(long entityId) {
286            Long value = new Long(entityId);
287            Entity entity = (Entity)Scene.getDataManager().getEntity()[dataFilter.getTargetType()].get(value);
288    
289            if (EntityName2Int.containsKey(entity.getName())) {
290                return (Integer)EntityName2Int.get(entity.getName());
291            } else {
292                Integer mappedId = new Integer(Int2Entity.size());
293                Int2Entity.put(mappedId,entity);
294                EntityName2Int.put(entity.getName(),mappedId);
295                return mappedId;
296            }
297        }
298    
299        public Object clone() {
300            ReferenceDimension o = (ReferenceDimension) super.clone();
301            o.comparatorList = (ArrayList)comparatorList.clone();
302            o.comparatorList.clear();
303            for (int i=0; i<comparatorList.size(); i++) {
304                o.comparatorList.add(((EntityComparator)comparatorList.get(i)).clone());
305            }
306            o.entity = null;
307            if (entity != null) {
308                o.entity = new Entity[entity.length];
309                for (int i=0; i<o.entity.length; i++)
310                    o.entity[i] = entity[i];
311            }
312            o.linkedEntity = HelperFuncs.cloneHashSet(linkedEntity);
313            o.Int2Entity = HelperFuncs.cloneHashMap(Int2Entity);
314            o.EntityName2Int = HelperFuncs.cloneHashMap(EntityName2Int);
315    
316            o.order = null;
317            if (order != null) {
318                o.order = new int[order.length];
319                for (int i=0; i<order.length; i++) {
320                    o.order[i] = order[i];
321                }
322            }
323    
324            o.sorter = (sorter == null) ? null : (Sorter)sorter.clone();
325            return o;
326        }
327    }